package gui;

import javax.swing.JLabel;
import javax.swing.JPanel;

import unidad.Unidad;

import juego.Logica;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;

import java.util.List;

public class ThreadMoverEnemigo extends Thread {

	protected int mov;
	protected int vel;
	protected Logica log;
	protected Map<JLabel,Unidad> mapeo;
	protected boolean terminar;
	protected JPanel panelPPAl;
	protected List<Unidad> aDesbloquear;
	protected List<JLabel> aMover;
	protected int i;
	protected Nivel gui;
	
	
	
	public ThreadMoverEnemigo(int vel, int moverse, Logica log, JPanel panel,Nivel gui) {
		mov = moverse;
		mapeo = new HashMap<JLabel,Unidad>();
		this.log = log;
		this.vel = vel;
		terminar = false;
		panelPPAl = panel;
		this.gui = gui;
	}
	
	public void run() {
		
		List<JLabel> aMatar = new LinkedList<JLabel>();
		List<JLabel> aMover = new LinkedList<JLabel>();
		List<Unidad> aDesbloquear = new LinkedList<Unidad>();
		List<Unidad> aBloquear = new LinkedList<Unidad>();
		while(!terminar)
		{
			i = 1;
			while( i <= mov ) 
			{
				for(Map.Entry<JLabel,Unidad> e: mapeo.entrySet())
				{
					int movimiento = log.moverse(e.getValue());
					if(movimiento == 1) //si se pudo mover
					{
						aBloquear.add(e.getValue()); //bloqueo la unidad en el tablero
						aMover.add(e.getKey());
					}
					else if(movimiento != 0)
						aMover.add(e.getKey());
					if((e.getKey().getLocation().x >= 0) && (e.getKey().getLocation().x <= mov) && (e.getValue().obtPosicionEnX() == 0))
						gui.perder();
				}
				
				for(Unidad u: aBloquear)
				{
					u.bloquear();
				}
				
				for(JLabel l: aMover)
				{
					l.setLocation((l.getLocation().x)-1, l.getLocation().y);
				}
				aMover.clear();
					
				
				try {
					Thread.sleep(vel);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				i++;
			}
			for(Unidad u: mapeo.values())
			{
				aDesbloquear.add(u);
			}
			for(Unidad u: aDesbloquear)
			{
				u.desbloquear();
			}
			aDesbloquear.clear();
			
			for(JLabel etiqueta: aMatar)
			{
				Unidad u = mapeo.remove(etiqueta);
				etiqueta.setVisible(false);
				panelPPAl.remove(etiqueta);
				if (u != null)
					log.matar(u);
			}
			aMatar.clear();
		}
	}
	
	public void terminar(){terminar = true;}
	
	public Map<JLabel,Unidad> getMapeo(){return(mapeo);}
	
	public int getIteracion(){return(i);}
	
	public void esperar()
	{
		try {
			Thread.sleep(0,5);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public void limpiarPantalla()
	{
		List<JLabel> aMatar = new LinkedList<JLabel>();
		for(Entry<JLabel,Unidad> e : mapeo.entrySet())
			aMatar.add(e.getKey());
		for(JLabel etiqueta: aMatar)
		{
			Unidad u = mapeo.remove(etiqueta);
			etiqueta.setVisible(false);
			panelPPAl.remove(etiqueta);
			if (u != null)
				log.matar(u);
		}
		aMatar.clear();
	}
}
